//
// Copyright (c) 2010 Alex Nesterenko
//

#include "nane/core/crt/std/StdFileBase_.h"

#include <cassert>
#include <cstring>

namespace nane
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    StdFileBase::StdFileBase( FILE* _interface, const char* _filename )
        : SubSystemProductImpl<FILE*>( _interface )
        , m_filename( NULL )
    {
        m_filename = new char[std::strlen(_filename)+1];
        std::strcpy(m_filename, _filename);        
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    StdFileBase::~StdFileBase()
    {
        delete[] m_filename;
        m_filename = NULL;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 StdFileBase::tell()
    {
        assert( m_interface != NULL );
        return std::ftell(m_interface);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void StdFileBase::seek( uint32 _pos )
    {
        // file must be opened
        assert( m_interface != NULL );
        std::fseek(m_interface, static_cast<long>(_pos), SEEK_SET);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 StdFileBase::size() const
    {
        assert( m_interface != NULL );
        uint32 size = -1;
        long int pos = std::ftell(m_interface);
        if( std::fseek(m_interface, 0, SEEK_END) == 0 )
        {
            size = static_cast<uint32>(std::ftell(m_interface));
        }
        std::fseek(m_interface, pos, SEEK_SET);
        return size;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
